home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / e / modulesmc.lha / ModulesMC1 / stringf20.doc < prev    next >
Encoding:
Text File  |  1994-11-21  |  4.0 KB  |  194 lines

  1. /* an early version of stringf20.e, written mostly in E  */
  2. OPT MODULE
  3.  
  4. SET PAD,LEFT,BIN,FIELD
  5.  
  6. EXPORT PROC writef(format,streamptr=NIL:PTR TO LONG)
  7. DEF s[240]:STRING
  8. PutStr(stringf(s,format,streamptr))
  9. ENDPROC
  10.  
  11. EXPORT PROC stringf(str:PTR TO CHAR,format:PTR TO CHAR,dataptr=NIL:PTR TO LONG)
  12. DEF tempstr[80]:STRING, savestr, savetempstr, templen,
  13.     streamstring:PTR TO CHAR,
  14.     ch,padch, number,i,flag=0,left=0,right=0
  15.  
  16.   savestr:=str
  17.   REPEAT
  18.     str[]++ := format[]
  19.  
  20. nextformat:
  21.     i:=0; flag:=0; right:=0; left:=0
  22.     ch:=format[]
  23.     IF ch="%"
  24. nextch:
  25.       i++
  26.       ch:=format[i]
  27.       SELECT  ch
  28.     CASE "l"; JUMP gotlong
  29.     CASE "s"; JUMP gotstring
  30.     CASE "-"; flag:=flag OR LEFT; JUMP nextch
  31.     CASE "0"; flag:=flag OR PAD; JUMP nextch
  32.     DEFAULT; IF (ch>"0") AND (ch<="9")
  33.             flag:=flag OR FIELD; JUMP field
  34.          ELSE
  35.            str[]++ := format[]++; JUMP nextformat
  36.          ENDIF
  37.       ENDSELECT
  38.     ENDIF
  39. endloop:
  40.     format++
  41.   UNTIL str[-1]=0
  42.   str:=str-savestr
  43.   MOVE.L str,D1
  44. JUMP endstringf
  45.  
  46. gotstring:
  47.   format:=format+i
  48.   str--
  49.   streamstring:=dataptr[]++
  50.   IF flag AND  FIELD
  51.     savetempstr:=tempstr
  52.     templen:=0
  53.     REPEAT
  54.       savetempstr[]++ := streamstring[]++
  55.       templen++
  56.     UNTIL streamstring[-1]=0
  57.     savetempstr:=tempstr
  58.     templen--
  59.     IF templen>right THEN templen:=right
  60.     BSR dopad
  61.     NOP
  62.   ELSE
  63.     REPEAT
  64.       str[]++ := streamstring[]++
  65.     UNTIL streamstring[-1]=0
  66.     str--
  67.   ENDIF
  68.   JUMP endloop
  69.  
  70. gotlong:
  71.   format:=format+i+1
  72.   str--
  73.   ch:=format[]
  74.   SELECT ch
  75.     CASE "d"; savetempstr:=tempstr; number:=dataptr[]++;
  76.           MOVE.L tempstr,A0
  77.           MOVE.L number,D0
  78.           SUBA.W  #14,A7
  79.           MOVEA.L A7,A3
  80.           MOVE.L D0,D2
  81.           BGE.S repeat
  82.           NEG.L D0
  83.           repeat:
  84.           MOVEQ  #0,D1
  85.           LONG $4C7C0401,$A   /* DIVU.L #10,D1:D0       */
  86.           ADDI.B #"0",D1
  87.           MOVE.B D1,(A3)+
  88.           TST.L D0
  89.           BGT.S repeat
  90.           TST.L D2
  91.           BGE.S notneg
  92.           MOVE.B #"-",(A3)+
  93.           notneg:
  94.           MOVE.B  -(A3),(A0)+
  95.           CMPA.L  A3,A7
  96.           BLT.S notneg
  97.           ADDA.W #14,A7
  98.           MOVE.L A0,D0
  99.           SUB.L  savetempstr,D0
  100.           MOVE.L D0,templen
  101.           BSR dopad
  102.  
  103.     CASE "x"; savetempstr:=tempstr; number:=dataptr[]++;
  104.           MOVE.L number,D0
  105.           MOVEA.L savetempstr,A0
  106.           MOVEA.L A7,A3
  107.           SUBA.W  #14,A3
  108.           MOVEQ #-1,D2
  109.           nextltr:
  110.           MOVE.B D0,D1
  111.           ANDI.B #$0F,D1
  112.           ADDI.B #48,D1
  113.           CMPI.B #57,D1
  114.           BLE.S around
  115.           ADDQ.B #7,D1
  116.           around:
  117.           MOVE.B D1,(A3)+
  118.           LSR.L #4,D0
  119.           DBEQ D2,nextltr
  120.           NOT.L D2
  121.           MOVE.L D2,D0
  122.           ADDQ.L #1,D0
  123.           loadstr:
  124.           MOVE.B -(A3),(A0)+    /* reverse buffer  */
  125.           DBF D2,loadstr
  126.           MOVE.L D0,templen
  127.           BSR dopad
  128.     CASE "c"; str[]++:=dataptr[]++
  129.  
  130.     CASE "b"; savetempstr:=tempstr; number:=dataptr[]++;
  131.           MOVEA.L savetempstr,A0
  132.           MOVE.L number,D0
  133.           BEQ.S binzero
  134.           MOVEQ #31,D1
  135.           next0:
  136.           BTST  D1,D0
  137.           DBNE D1,next0
  138.           nextbit:
  139.           BTST D1,D0
  140.           BEQ.S bit0
  141.           MOVE.B #"1",(A0)+
  142.           BRA.S bit1
  143.           bit0:
  144.           MOVE.B #"0",(A0)+
  145.           bit1:
  146.          DBRA D1,nextbit
  147.          BRA.S endbin
  148.          binzero:
  149.          MOVE.B #"0",(A0)+
  150.          endbin:
  151.          SUBA.L savetempstr,A0
  152.          MOVE.L A0,templen
  153.          BSR.S dopad
  154.  
  155.     DEFAULT; str[]++ := "%"; str[]++ :="l"; str[]++ := ch
  156.   ENDSELECT
  157.   JUMP endloop
  158.  
  159. dopad:
  160.   IF templen>=left
  161.     FOR i:=1 TO templen DO str[]++ := savetempstr[]++
  162.   ELSE
  163.     padch:=IF flag AND PAD THEN "0" ELSE " "
  164.     IF flag AND LEFT
  165.       FOR i:=1 TO templen DO str[]++ := savetempstr[]++
  166.       FOR i:=1 TO left-templen DO str[]++:=padch
  167.     ELSE
  168.       FOR i:=1 TO left-templen DO str[]++:=padch
  169.       FOR i:=1 TO templen DO str[]++ := savetempstr[]++
  170.     ENDIF
  171.   ENDIF
  172.   RTS
  173.  
  174. field:
  175.   left:=ch-"0"
  176.   WHILE ((ch:=format[i+1])<>".")
  177.     i++
  178.     left:=10*left+ch-"0"
  179.   ENDWHILE
  180.   i:=i+2
  181.   ch:=format[i]
  182.   right:=ch-"0"
  183. /*  WHILE (ch:=format[i+1]>="0") AND (ch<="9") */   /* doesn't work  */
  184.   WHILE (format[i+1]>="0") AND (format[i+1]<="9")
  185.     i++
  186.     ch:=format[i]
  187.     right:=10*right+ch-"0"
  188.   ENDWHILE
  189.   JUMP nextch
  190.  
  191. endstringf:
  192. ENDPROC savestr
  193.  
  194.